package cn.yza.并发.构建高效且可伸缩的结果缓存;

import java.util.HashMap;
import java.util.Map;

/** 使用HashMap来保存之前计算的结果
 *  compute方法将首先检查需要的结果是否已在缓存中，如果存在则返回之前计算的值
 *   否则，将把计算结果缓存在HashMap中，然后再返回
 * @author Honglixi
 * @create 2021-11-02 22:02
 */
public class Memoizer1<A,V> implements Computable<A,V>{

    private final Map<A,V> cache = new HashMap<>();
    private final Computable<A,V> c;

    public Memoizer1(Computable<A, V> c) {
        this.c = c;
    }

    @Override
    public synchronized V compute(A arg) throws InterruptedException {
        V result = cache.get(arg);
        if (result == null) {
            result = c.compute(arg);
            cache.put(arg,result);
        }
        return result;
    }
}
